# -*- coding: utf8 -*-
"""
Created on Tue Oct 16 16:31:24 2012

@author: (Ago) Milan Augustin

aaaugustin@gmail.com
"""

try:
    from PyQt4.QtGui import  QLabel,  \
        QMainWindow, QAction, QToolBar, QIcon, \
        QPixmap, QScrollArea
    from PyQt4.Qt import QTimer
    from PyQt4.Qt import Qt
except ImportError:
    print "Missing dependency: python-qt4"
    exit(255)

import os, shutil, time


# Vlastní moduly


class Projektor(QMainWindow):  
    def __init__(self, p, p1, s, v, p2, slozkaSablony, directory=None, parent=None):
        self.instSpustit = p
        self.instPohybZ = p1
        self.casNeEx =p2
        self.slozkaSablony=slozkaSablony
        QMainWindow.__init__(self, parent)

        # Nastavení názvu a změna velikosti
        self.setWindowTitle("Projektor")
        self.resize(s, v)
        #self.showFullScreen()
        
        # Vytvořit widget obrázek
        self.image = QLabel()
        self.image.setScaledContents(True)
       
                
        # Vytvořit scrollarea pro obraz widgetu
        self.scrollarea = QScrollArea()
        self.scrollarea.setWidget(self.image)
        self.scrollarea.setAlignment(Qt.AlignVCenter|Qt.AlignHCenter)
        self.setCentralWidget(self.scrollarea)
        self.scrollarea.setStyleSheet("border: 1px solid #770101; background-color: #5c0404")

        # Vkopíruje první snímek -Tisk připraven + podložku
        pocet = self.instSpustit.podlozkaX.value() + 5
        podlozkaCislo = self.instSpustit.podlozkaVel.value()

        if podlozkaCislo == 1:
            podlozka = "Podlozka1"
            print podlozka

        if podlozkaCislo == 2:
            podlozka = "Podlozka2"
            print podlozka            

        if podlozkaCislo == 3:
            podlozka = "Podlozka3"
            print podlozka 

        if podlozkaCislo == 4:
            podlozka = "Podlozka4"
            print podlozka   
            
        if podlozkaCislo == 5:
            podlozka = "Podlozka5"
            print podlozka            
            
        for x in range (pocet):
            o=str(10000+x)
            #nazev=os.getcwd()+"/Sablony/Podlozka/"+o+".png"
            nazev=os.getcwd()+"/Sablony/"+podlozka+"/"+o+".png"
            srcfile = nazev
            directory =os.getcwd()
            nazevN=os.getcwd()+"/Rezy/"+o+".png"
            dstfile = nazevN       
            try:                                   
                shutil.copy(srcfile,os.path.join(directory,dstfile))
            except Exception,e:
                print e        
        
        # Přečtěte si názvy souborů z  adresáře "Rezy" a zobrazí první
        #direct=os.getcwd()+"/Rezy/"
        direct =self.slozkaSablony
        self.filenames = [
            os.path.join(str(direct), filename)
            
            for filename in os.listdir(direct)
            if filename.endswith(".jpg") or filename.endswith(".png")]

            
        # Create actions
        actionSlideshow = QAction(
            QIcon(os.getcwd()+"/ikony/spustit.png"),
            "Spustit - Ctrl+t",
            self)
        actionSlideshow.setShortcut('Ctrl+t')    
        actionSlideshow.setCheckable(True)
        actionPrev = QAction(
            QIcon(os.getcwd()+"/ikony/zpet.png"),
            "Zpet - ",
            self)
        actionPrev.setShortcut('-')    
        actionNext = QAction(
            QIcon(os.getcwd()+"/ikony/dalsi.png"),
            "Dalsi +",
            self)
        actionNext.setShortcut('+')
        actionClose = QAction(
            QIcon("/ikony/konec.png"),
            "Konec - ctrl+q",
            self)
        actionClose.setShortcut('Ctrl+q')    
        self.actionZoomIn = QAction(
            QIcon("/usr/share/icons/gnome/24x24/actions/zoom-in"),
            "Zoom in",
            self)
        self.actionZoomOut = QAction(
            QIcon("/usr/share/icons/gnome/24x24/actions/zoom-out"),
            "Close",
            self)
        actionFullScreen=QAction(
            QIcon("/usr/share/icons/gnome/24x24/actions/zoom-out"),
            "Max - F11",
            self)
        actionFullScreen.setShortcut('F11')
        actionFullScreen.setCheckable(True)
        actionPauza=QAction(
            QIcon("/usr/share/icons/gnome/24x24/actions/zoom-out"),
            "Pauza - ctrl+p",
            self)
        actionPauza.setShortcut('Ctrl+p')    
        actionPauza.setCheckable(True)            

        # Connect signals to slots
        actionSlideshow.triggered.connect(self.toggleSlideshow)
        actionNext.triggered.connect(self.showNextObr)
        actionPrev.triggered.connect(self.showPrev)
        actionClose.triggered.connect(self.konec)
        actionClose.triggered.connect(self.close)
        actionFullScreen.triggered.connect(self.toggleFullScreen)
        actionPauza.triggered.connect(self.pauza)
    
        # Create toolbar and add actions
        toolbar = QToolBar()
        toolbar.addAction(actionSlideshow)
        toolbar.addAction(actionPrev)
        toolbar.addAction(actionNext)
        toolbar.addAction(actionFullScreen)
        toolbar.addAction(actionClose) 
        toolbar.addAction(actionPauza)
        toolbar.setStyleSheet("border: 1px solid #770101; background-color: #5c0404")
        
        
        # Attach toolbar to the main window
        self.addToolBar(toolbar)
        
        # Show the first image
        self.showImage(0)
        self.index= 0
        
        # Maximalizuje okno pro tisk snímku
    def toggleFullScreen(self, checked):
        if checked:
            self.showFullScreen()
            #self.showMaximized()
            self.instSpustit.listWidget.addItem("MAX_Window - zapnuto")
            
        else:
            self.showNormal()
            self.instSpustit.listWidget.addItem("Window - normal")
        
        
        # Slideshow timer - (jednotlivé snímky)
    def casovac(self, cas):
        self.casVrs =cas*1000
        self.casV=self.casVrs
        self.timer = QTimer()
        self.timer.timeout.connect(self.showNextZ)
        self.timer.setInterval(self.casV)

        # Nastaví předpokládaný čas tisku
        self.instSpustit.predpC(len(self.filenames))

    def tisk(self):
        self.timer.start()
        self.instSpustit.casTisku()        
        
    def toggleSlideshow(self, checked):
        if checked:
            #self.instPohybZ.onClona()
            self.timer.start()
            self.instSpustit.casTisku()
        else:
            self.timer.stop()
            self.instSpustit.casTiskStop()

#--------------------------------------------------------------
        # Bez expozice při Kroku nahoru .  !              
    def showNextZ(self):
        self.timer.stop()     
        self.casNe=self.casNeEx*1000
        self.indexS=self.index
        self.index=0
        print self.index
        #self.showNext()    
        self.casovacZ(self.casNe)
        self.instPohybZ.stop() # Zavře clonu
        
        # Časová prodleva pro Krok 
    def casovacZ(self, cas):
        self.timerZ = QTimer()
        self.timerZ.timeout.connect(self.dalsi)
        self.timerZ.setInterval(cas)
        self.timerZ.start()
        self.showNext() # ///
        
        
    # vybuduje základnu    
    def dalsi(self):
        self.timerZ.stop()
        if self.indexS>1000:           # Počet vrstev (omez.)
            self.index = len(self.filenames)-1
            self.timerZ.stop()
            self.showNext() 
        elif 6< self.indexS < len(self.filenames):           
            if self.indexS == 1000 or self.indexS == 1100:   # Čistění vrstva
                print "Cisteni HP"
                self.instPohybZ.setCisteni()
                self.prodleva()
                
            else:
                self.instPohybZ.krok(self.delka)
                self.prodleva()
                     
           
        elif self.indexS ==3:                   # první 3 stejné snímky  bez pohybu (3x expozice)
            self.instPohybZ.krok(self.delka)
            self.prodleva()
        elif self.indexS ==5:                   # druhé 2 stejné snímky  bez pohybu (2x expozice)
            self.instPohybZ.krok(self.delka)
            self.prodleva()

            
        else:
            print "Bez pohybu"
            self.instPohybZ.onClona()
            self.index=self.indexS+1
            self.showNext()
            self.timer.start()
    
    # Způsobí časovou prodlevu potřebnou pro krok nahoru , zavolá další obrázek
    # Otevře clonu
    def prodleva(self):            
            time.sleep(0.5)  
            self.index=self.indexS+1
            if 0<= self.index < len(self.filenames):
                self.showNext()
                time.sleep(0.5)
                self.timer.start()
                self.instPohybZ.onClona()
            else:
                self.timer.stop()
                self.timerZ.stop()
            
#-----------------------------------------------------------------
            
    def showNext(self):
        if 0<= self.index < len(self.filenames)-1:
            try:    
                self.showImage(self.index)                                      
            except Exception,e:
                print e      
            print "index=",self.index, "CI=", self.currentIndex,"filenames:",len(self.filenames)
            
            #Zobrazuje číslo tisknuté vrstvy
            if 0< self.indexS < len(self.filenames):
                self.instSpustit.vrstvaCis(self.indexS)

        else:
            self.showImage(self.currentIndex)
            print "Poslední šablona - Vypnout projektor!!"
            self.timer.stop()
            self.instSpustit.casTiskStop()
            self.instPohybZ.offProjektor()    
            
    def rozliseni(self, a, b, c):    
        if a:
            self.delka = "a"
            print "OK a"
        if b:
            self.delka = "b"
            print "OK b"
        if c:
            self.delka = "c"
            print "OK c"
        
    def showNextObr(self):
        print "Dalsi"
        if self.currentIndex >= len(self.filenames) - 1:
            self.showImage(0)
              
        try:    
            self.showImage(self.currentIndex + 1)                                      
        except Exception,e:
            print e          

    def showPrev(self):
        if self.currentIndex <= 0:
            self.showImage(len(self.filenames) - 1)
        self.showImage(self.currentIndex - 1)

    def fitToWindow(self):
        a = float(self.scrollarea.viewport().width()) / self.image.pixmap().width()
        b = float(self.scrollarea.viewport().height()) / self.image.pixmap().height()
        self.zoom = min(a, b)
        self.resizeImage()
        
        
    def resizeImage(self):
        self.image.resize( self.zoom * self.image.pixmap().size() )
        
         #Determine maximum and minimum dimension
        max_dimension = self.zoom * max(
            self.image.pixmap().width(),
            self.image.pixmap().height())
        min_dimension = self.zoom * min(
            self.image.pixmap().width(),
            self.image.pixmap().height())
            
        # Disable zooming buttons accordingly
        self.actionZoomIn.setEnabled(
            max_dimension <= 4000)
        self.actionZoomOut.setEnabled(
            min_dimension >= 200)

    def showImage(self, index):
        filename = self.filenames[index]
        self.currentIndex = index
        self.image.setPixmap(QPixmap(filename))
        self.setWindowTitle("%i/%i %s" % (index+1, len(self.filenames), filename))
        self.fitToWindow()

    def resizeEvent(self, event):
        self.fitToWindow()
        
    def konec(self):
        self.timer.stop()
        self.timerZ.stop() 
        self.instSpustit.casTiskStop()
    
    # Zastaví tisk , plošina vyjede nahoru , 
    # Opětovné stisknutí - pokračuje tisk    
    def pauza(self, checked):
        p=200
        m=str("c")
        if checked:
            self.timer.stop()
            self.timerZ.stop()
            self.index=0
            print "Pauza"
            self.showNext()
            self.instPohybZ.krokNah(m, p)
            
        else:
            print "Pokračuji"
            self.index =self.indexS+1
            self.timer.start()
            self.instPohybZ.krokDol(m, p)
        
     


